--
-- Created by IntelliJ IDEA.
-- User: xueal
-- Date: 2018/3/29
-- Time: 15:18
-- To change this template use File | Settings | File Templates.
--

module("Metatable", package.seeall)
--
--tb = {"xan", "lily", a=1,b=2,"jane"}
--
--for k,v in ipairs(tb) do
--    print(k.." "..v)
--end
--
--print('-----------------------')
--
--for k,v in pairs(tb) do
--    print(k.." "..v)
--end
--
--function PrintHello()
--    print("hello")
--end


Set = {}

local mt = {}

function Set.new(l)
    local set = {}
    setmetatable(set, mt)
    for _,v in ipairs(l) do
        set [v] = true
    end
    return set
end

-- 算数类的元方法

function Set.union(a, b)
    local res = Set.new{}
    for k in pairs(a) do
        res[k] = true
    end
    for k in pairs(b) do
        res[k] = true
    end
    return res
end

function Set.intersaction(a, b)
    local res = Set.new{}
    for k in pairs(a) do
        res[k] = b[k]
    end
    return res
end

function Set.tostring(set)
    local l = {}
    for k in pairs(set) do
        l[#l + 1] = k
    end
    return table.concat(l, ', ')
end

-- 关系类的元方法

mt.__le = function (a, b)   -- 集合包含  可用于 <=  >= 比较
    for k in pairs(a) do
        if not b[k] then return false end
    end
    return true
end

mt.__lt = function (a, b)
    return a <= b and not (b >= a)
end

-- 如果两个对象拥有不同的元方法，那么等于操作不会调用任何一个元方法，而是直接返回false
mt.__eq = function (a, b)
    return a <= b and b <= a
end


mt.__add = Set.union
mt.__mul = Set.intersaction
mt.__tostring = Set.tostring

local s1 = Set.new{2, 3, 4, "abc" }
local s2 = Set.new{5, "abc" }

print(s1 <= s2)
print(s1 == s2)

--local mt_s1 = getmetatable(s1)
--
--print(mt_s1)
--
--for k,v in pairs(mt_s1) do
--    print(k..' '..v)
--end

--
--print(getmetatable(s1))
--print(getmetatable(s2))

--print(Set.tostring(s1 + s2))
--print(Set.tostring(s1 * s2))

--print(getmetatable(s1)..' '..getmetatable(s2))

--print(s1)

--return tb


-- table访问的元方法
Window = {}
Window.prototype = {x = 0, y = 0, width = 100, height = 100 }
Window.mt = {}

function Window.new (o)
    setmetatable(o, Window.mt)
    return o
end

Window.mt.__index = function(table, key)
    return Window.prototype[key]
end

-- 或者
Window.mt.__index = Window.prototype

